home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 15 / CU Amiga Magazine's Super CD-ROM 15 (1997)(EMAP Images)(GB)[!][issue 1997-10].iso / CUCD / Graphics / Ghostscript / source / gs_pdf.ps < prev    next >
Text File  |  1997-04-16  |  18KB  |  592 lines

  1. %    Copyright (C) 1994, 1996, 1997 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % gs_pdf.ps
  16. % ProcSet for PostScript files created by the PDF to PostScript converter.
  17. % This ProcSet requires only a Level 1 interpreter, unless fonts other
  18. % than ordinary Type 1 or Type 3 fonts are involved.
  19.  
  20. % pdf2ps copies this file from %BEGIN to the end.
  21.  
  22. %BEGIN
  23. mark                % patches
  24. /currentglobal { false }
  25. /setglobal { pop }
  26. /packedarray { array astore readonly }
  27. /setcmykcolor {
  28.   1 exch sub
  29.   4 -1 roll 1 exch sub 1 index mul
  30.   4 -1 roll 1 exch sub 2 index mul
  31.   4 -2 roll exch 1 exch sub mul
  32.   setrgbcolor
  33. }
  34. /setpagedevice {
  35.   statusdict /pageparams get exec
  36.   4 index /PageSize .knownget { aload pop 6 -2 roll pop pop 4 2 roll } if
  37.   4 index /Orientation .knownget { 3 -1 roll pop exch } if
  38.   statusdict /setpageparams get exec
  39.   /PageOffset .knownget { aload pop translate } if
  40. }
  41. /setoverprint { pop }
  42. /setstrokeadjust { pop }
  43. /.copydict { dup 3 -1 roll { put dup } forall pop }
  44. /.dicttomark {
  45.   counttomark 2 idiv dup dict begin { def } repeat pop currentdict end
  46. }
  47. /.knownget { 2 copy known { get true } { pop pop false } ifelse }
  48. /.setdefaultscreen { }
  49. counttomark 2 idiv {
  50.   1 index where { pop pop pop } { bind executeonly def } ifelse
  51. } repeat pop
  52.  
  53. currentglobal true setglobal
  54.  
  55. % Define pdfmark.  Don't allow it to be bound in.
  56. % Also don't define it in systemdict, because this leads some Adobe code
  57. % to think this interpreter is a distiller.
  58. % (If this interpreter really is a distiller, don't do this.)
  59. systemdict /pdfmark known not
  60.  { userdict /pdfmark { cleartomark } bind put } if
  61.  
  62. % This ProcSet is designed so that it can be used either to execute PDF
  63. % (the default) or to convert PDF to PostScript.  See ! and ~ below.
  64.  
  65. userdict /GS_PDF_ProcSet 119 dict dup begin
  66.  
  67. % ---------------- Abbreviations ---------------- %
  68.  
  69. /bdef { bind def } bind def
  70.  
  71. % ---------------- Operator execution ---------------- %
  72.  
  73. % We record "operator" names in a dictionary with their argument counts,
  74. % so that they can easily be redefined later to write PostScript in
  75. % addition to (or instead of) being executed.
  76.  
  77. /numargsdict 100 dict def
  78. /!        % <procname> <proc> <numargs> ! -
  79.  { //numargsdict 3 index 3 -1 roll put def
  80.  } bdef
  81. /~        % <procname> <opname> <numargs> ~ -
  82.  { exch cvx 1 packedarray cvx exch !
  83.  } bdef
  84.  
  85. % ---------------- Graphics state stack ---------------- %
  86.  
  87. % PDF adds a number of parameters to the graphics state.
  88. % We implement this by pushing and popping a dictionary
  89. % each time we do a PDF gsave or grestore.
  90. % The keys in this dictionary are as follows:
  91. %    self            % identifies the dictionary as one of ours
  92. %    Show
  93. %    TextOrigin        % origin of current line, in text space
  94. %    TextSaveMatrix        % matrix at time of BT
  95. % (The following correspond directly to PDF state parameters.)
  96. %    FillColor
  97. %    FillColorSpace
  98. %    StrokeColor
  99. %    StrokeColorSpace
  100. %    TextSpacing
  101. %    TextHScaling
  102. %    Leading
  103. %    TextFont
  104. %    TextMatrix
  105. %    TextRise
  106. %    TextRenderingMode
  107. %    WordSpacing
  108.  
  109. /nodict 1 dict def
  110. nodict /self { //nodict } executeonly put
  111. nodict readonly pop
  112.  
  113. /beginpage
  114.  { //nodict 20 dict .copydict begin graphicsbeginpage textbeginpage
  115.  } bdef
  116. /endpage
  117.  { showpage end
  118.  } bdef
  119.  
  120. /graphicsbeginpage { initgraphics  0 g  0 G } bdef
  121.  
  122. /gput        % <value> <key> gput -
  123.  { exch currentdict //nodict eq { /self dup load end 5 dict begin def } if
  124.         % If we're in a Level 1 system, we need to grow the
  125.         % dictionary explicitly.
  126.    currentdict length currentdict maxlength ge %eq
  127.     { currentdict dup length 3 mul 2 idiv 1 add dict .copydict end begin 
  128.     }
  129.    if def
  130.  } bdef
  131.  
  132. /q_
  133.  { gsave //nodict begin
  134.  } bdef
  135. /q /q_ load 0 !
  136. % Some PDF files have excess Q operators!
  137. /Q_
  138.  { currentdict /self .knownget { exec //nodict eq { end grestore } if } if
  139.  } bdef
  140. /Q /Q_ load 0 !
  141.  
  142. % ---------------- Graphics state parameters ---------------- %
  143.  
  144. /d /setdash 2 ~
  145. /i /setflat 1 ~
  146. /j /setlinejoin 1 ~
  147. /J /setlinecap 1 ~
  148. /M /setmiterlimit 1 ~
  149. /w /setlinewidth 1 ~
  150.  
  151. % ---------------- Color setting ---------------- %
  152.  
  153. /fcput        % <color> <colorspace> fcput -
  154.  { /FillColorSpace gput /FillColor gput
  155.  } bdef
  156. /scput        % <color> <colorspace> scput -
  157.  { /StrokeColorSpace gput /StrokeColor gput
  158.  } bdef
  159.  
  160. /csdevgray [/DeviceGray] readonly def
  161. /csdevrgb [/DeviceRGB] readonly def
  162. /csdevcmyk [/DeviceCMYK] readonly def
  163.  
  164. /CSdict 11 dict dup begin
  165.   /DeviceGray { 0 exch } bdef
  166.   /DeviceRGB { [0 0 0] cvx exch } bdef
  167.   /DeviceCMYK { [0 0 0 1] cvx exch } bdef
  168.   /Indexed
  169.    { dup 1 get csset exch pop
  170.      dup 2 index 1 get eq
  171.       { pop }
  172.       { exch 4 array copy dup 1 4 -1 roll put }
  173.      ifelse 0 exch
  174.     } bdef
  175.   /setcolorrendering where
  176.    { pop
  177.      /CalGray
  178.       { 1 get dup /Gamma .knownget
  179.      { dup length 1 add dict .copydict
  180.        dup /DecodeA 4 -1 roll /exp load 2 packedarray cvx put
  181.          }
  182.     if /CIEBasedA exch 2 array astore 0 exch
  183.       } bdef
  184.      /CalRGB
  185.       { 1 get dup /Gamma known 1 index /Matrix known or
  186.      { dup length 2 add dict .copydict
  187.        dup /Matrix .knownget { 1 index /MatrixABC 3 -1 roll put } if
  188.        dup /Gamma .knownget
  189.         { [ exch { /exp load 2 packedarray cvx } forall
  190.           ] 1 index /DecodeABC 3 -1 roll put
  191.         }
  192.        if
  193.          }
  194.     if /CIEBasedABC exch 2 array astore [0 0 0] cvx exch
  195.       } bdef
  196.      /CalCMYK { pop //csdevcmyk csset } bdef    % not supported yet
  197.    }
  198.    { /CalGray { pop //csdevgray csset } bdef
  199.      /CalRGB { pop //csdevrgb csset } bdef
  200.      /CalCMYK { pop //csdevcmyk csset } bdef
  201.    }
  202.   ifelse
  203. end def
  204. /csset            % <cspace> csset <color> <cspace>
  205.  { dup dup type /nametype ne { 0 get } if //CSdict exch get exec
  206.  } bdef
  207.  
  208. /g { //csdevgray fcput } 1 !
  209. /G { //csdevgray scput } 1 !
  210. /rg { 3 array astore cvx //csdevrgb fcput } 3 !
  211. /RG { 3 array astore cvx //csdevrgb scput } 3 !
  212. /k { 4 array astore cvx //csdevcmyk fcput } 4 !
  213. /K { 4 array astore cvx //csdevcmyk scput } 4 !
  214. /cs { csset fcput } 1 !
  215. /CS { csset scput } 1 !
  216. % We have to break up sc according to the number of operands.
  217. /sc1 { /FillColor gput } 1 !
  218. /SC1 { /StrokeColor gput } 1 !
  219. /sc3 { /FillColor load astore pop } 3 !
  220. /SC3 { /StrokeColor load astore pop } 3 !
  221. /sc4 { /FillColor load astore pop } 4 !
  222. /SC4 { /StrokeColor load astore pop } 4 !
  223.  
  224. % ---------------- Color installation ---------------- %
  225.  
  226. % Establish a given color (and color space) as current.
  227. /setfillcolor { FillColor FillColorSpace setgcolor } def
  228. /setstrokecolor { StrokeColor StrokeColorSpace setgcolor } def
  229. /CIdict mark            % only used for Level 1
  230.   /DeviceGray 1   /DeviceRGB 3   /DeviceCMYK 4
  231.   /CIEBaseA 1   /CIEBaseABC 3   /CIEBasedDEF 3   /CIEBaseDEFG 4
  232. .dicttomark def
  233. /Cdict 11 dict dup begin    % <color...> <colorspace> -proc- -
  234.   /DeviceGray { pop setgray } bdef
  235.   /DeviceRGB { pop setrgbcolor } bdef
  236.   /DeviceCMYK { pop setcmykcolor } bdef
  237.   /CIEBasedA
  238.    { dup currentcolorspace eq { pop } { setcolorspace } ifelse setcolor } bdef
  239.   /CIEBasedABC /CIEBasedA load def
  240.   /CIEBasedDEF /CIEBasedA load def
  241.   /CIEBasedDEFG /CIEBasedA load def
  242.   /Indexed /setcolorspace where
  243.    { pop /CIEBasedA load }
  244.    { /setindexedcolor cvx }
  245.   ifelse def
  246. end def
  247. /setindexedcolor        % <index> [/Indexed base hival proc|str]
  248.                 %   setindexedcolor - (only used for Level 1)
  249.  { mark 3 -1 roll
  250.    2 index 3 get    % Stack: cspace -mark- index proc|str
  251.    dup type /stringtype eq
  252.     { //CIdict 4 index 1 get 0 get get        % # of components
  253.       dup 4 -1 roll mul exch getinterval { 255 div } forall
  254.     }
  255.     { exec
  256.     }
  257.    ifelse
  258.    counttomark 2 add -2 roll pop
  259.    1 get setgcolor
  260.  } bdef
  261. /setgcolor    % (null | <color...>) <colorspace> setgcolor -
  262.  { 1 index null eq
  263.     { pop pop }
  264.     { dup 0 get //Cdict exch get exec }
  265.    ifelse
  266.  } bdef
  267. /fsexec        % <fillop|strokeop> fsexec -
  268.  {        % Preserve the current point, if any.
  269.     { currentpoint } stopped
  270.     { $error /newerror false put   cvx exec }
  271.     { 3 -1 roll cvx exec moveto }
  272.    ifelse
  273.  } bdef
  274.  
  275. % ---------------- Transformations ---------------- %
  276.  
  277. /cmmatrix matrix def
  278. /cm { //cmmatrix astore concat } 6 !
  279.  
  280. % ---------------- Path creation ---------------- %
  281.  
  282. /m /moveto 2 ~
  283. /l /lineto 2 ~
  284. /c /curveto 6 ~
  285. /h /closepath 0 ~
  286. /v { currentpoint 6 2 roll curveto } 4 !
  287. /y { 2 copy curveto } 4 !
  288. /re
  289.  { 4 2 roll moveto  exch dup 0 rlineto  0 3 -1 roll rlineto  neg 0 rlineto
  290.    closepath
  291.  } 4 !
  292.  
  293. % ---------------- Path painting and clipping ---------------- %
  294.  
  295. /S_ { setstrokecolor /stroke fsexec } bdef
  296. /S { S_ } 0 !
  297. /f { setfillcolor /fill fsexec } 0 !
  298. /f* { setfillcolor /eofill fsexec } 0 !
  299. /n_ { newpath } bdef        % don't allow n_ to get bound in
  300. /n { n_ } 0 !
  301. /s { closepath S_ } 0 !
  302. /B_ { gsave setfillcolor fill grestore S_ } bdef
  303. /B /B_ load 0 !
  304. /b { closepath B_ } 0 !
  305. /B*_ { gsave setfillcolor eofill grestore S_ } bdef
  306. /B* /B*_ load 0 !
  307. /b* { closepath B*_ } 0 !
  308.  
  309. % Clipping:
  310.  
  311. /Wdict 4 dict dup begin
  312. /S_ { gsave setstrokecolor stroke grestore n_ } bdef
  313. /f { gsave setfillcolor fill grestore n_ } 0 !
  314. /f* { gsave setfillcolor eofill grestore n_ } 0 !
  315. /n_ { end clip newpath } bdef
  316. end readonly def
  317. /W { //Wdict begin } 0 !
  318. /W*dict 4 dict dup begin
  319. /S_ { gsave setstrokecolor stroke grestore n_ } bdef
  320. /f { gsave setfillcolor fill grestore n_ } 0 !
  321. /f* { gsave setfillcolor eofill grestore n_ } 0 !
  322. /n_ { end eoclip newpath } bdef
  323. end readonly def
  324. /W* { //W*dict begin } 0 !
  325.  
  326. % ---------------- Images ---------------- %
  327.  
  328. % We mustn't bind these now, since they reference Level 2 operators.
  329. /Is        % <imagedict> Is <imagedict> <datasource>
  330.  { dup /DataSource get string /readstring cvx /currentfile cvx
  331.         % Stack: imagedict string -readstring- -currentfile-
  332.    3 index /FilterProc .knownget
  333.     { dup dup 0 get /ASCIIHexDecode eq exch length 2 eq and
  334.        { pop exch pop /readhexstring cvx exch }
  335.        { exch exec exch exec }
  336.       ifelse
  337.     }
  338.    if 3 1 roll /pop cvx 4 packedarray cvx
  339.  } bdef
  340. /EI { } def    % placeholder, only needed when writing PostScript
  341. % Note that ID* take a dictionary, not separate values;
  342. % ColorSpace must be a name if it has no parameters;
  343. % DataSource is the size of the row buffer in bytes;
  344. % FilterProc is an optional procedure for constructing the decoding filter;
  345. % and ImageMask is required, not optional.
  346. /csimage
  347.  { /setcolorspace where
  348.     { pop dup /ColorSpace get csset setcolorspace pop image }
  349.     { .colorspaceimage }
  350.    ifelse
  351.  } def        % don't bind, because of Level 2
  352. /ID    % <imagedict> ID -
  353.  { Is dup 3 -1 roll dup /ImageMask get
  354.     { setfillcolor dup /Interpolate .knownget not { false } if
  355.        { dup /DataSource 4 -1 roll put /imagemask cvx exec
  356.        }
  357.        {  { /Width /Height /Decode /ImageMatrix }
  358.       { 1 index exch get exch }
  359.      forall pop exch 0 get 0 ne exch
  360.      5 -1 roll imagemask
  361.        }
  362.       ifelse
  363.     }
  364.     { dup /ColorSpace get /DeviceGray eq
  365.       1 index /BitsPerComponent get 8 le and
  366.       1 index /Decode get dup 1 get 1 eq exch 0 get 0 eq and and
  367.       1 index /Interpolate .knownget not { false } if not and
  368.        {  { /Width /Height /BitsPerComponent /ImageMatrix }
  369.       { 1 index exch get exch }
  370.      forall pop 5 -1 roll image
  371.        }
  372.        { dup /DataSource 4 -1 roll put csimage
  373.        }
  374.       ifelse
  375.     }
  376.    ifelse
  377.         % If we were reading with readhexstring,
  378.         % skip the terminating > now.
  379.         % Stack: datasource
  380.    dup type /filetype ne        % array or packedarray
  381.     { dup 2 get /readhexstring eq
  382.        {  { dup 0 get exec read pop (>) 0 get eq { exit } if } loop
  383.        }
  384.       if pop
  385.     }
  386.     { pop
  387.     }
  388.    ifelse EI
  389.  } 1 !
  390. % IDx handles general images.
  391. /IDx    % <imagedict> IDx -
  392.  { Is 1 index /DataSource 3 -1 roll put
  393.    csimage EI
  394.  } 1 !
  395.  
  396. % ---------------- Text control ---------------- %
  397.  
  398. /textbeginpage
  399.  { /TextSpacing 0 def        % 0 Tc
  400.    /TextLeading 0 def        % 0 TL
  401.    /TextRenderingMode 0 def    % 0 Tr
  402.    /TextRise 0 def        % 0 Ts
  403.    /WordSpacing 0 def        % 0 Tw
  404.    /TextHScaling 1.0 def    % 100 Tz
  405.    /TextFont null def
  406.    /Show { showfirst } def
  407.  } bdef
  408.  
  409. % Contrary to the statement in the PDF manual, BT and ET *can* be nested,
  410. % if the CharProc for a Type 3 font does a BT/ET itself.
  411. % Since we always call the CharProc inside a q_/Q_, we simply ensure that
  412. % the text state is saved and restored like the rest of the extended
  413. % graphics state.
  414.  
  415. /settextmatrix
  416.  { TextMatrix concat
  417.    TextHScaling 1 ne { TextHScaling 1 scale } if
  418.    TextRise 0 ne { 0 TextRise translate } if
  419.  } bdef
  420. /settextstate { TextSaveMatrix setmatrix settextmatrix } bdef
  421.  
  422. /BT
  423.  { currentdict /TextMatrix .knownget
  424.     { identmatrix pop }
  425.     { matrix /TextMatrix gput }
  426.    ifelse
  427.    currentdict /TextOrigin .knownget
  428.     { dup 0 0 put 1 0 put }
  429.     { [0 0] cvx /TextOrigin gput }
  430.    ifelse
  431.     { showfirst } /Show gput
  432.    currentdict /TextSaveMatrix .knownget not
  433.     { matrix dup /TextSaveMatrix gput }
  434.    if currentmatrix pop settextmatrix 0 0 moveto
  435.    TextFont dup null eq { pop } { setfont } ifelse
  436.  } bind 0 !
  437. /ET
  438.  { TextSaveMatrix setmatrix
  439.  } bind 0 !
  440. /Tc_ { /TextSpacing gput { showfirst } /Show gput } bdef
  441. /Tc { Tc_ } 1 !
  442. /TL { /TextLeading gput } bind 1 !
  443. /Tr { /TextRenderingMode gput { showfirst } /Show gput } bind 1 !
  444. /Ts { /TextRise gput settextstate } bind 1 !
  445. /Tw_ { /WordSpacing gput { showfirst } /Show gput } bdef
  446. /Tw { Tw_ } 1 !
  447. /Tz { 100 div /TextHScaling gput settextstate } bind 1 !
  448.  
  449. % ---------------- Font control ---------------- %
  450.  
  451. /Tf        % <font> <scale> Tf -
  452.  { dup 1 eq { pop } { scalefont } ifelse
  453.    dup setfont /TextFont gput
  454.  } 2 !
  455.  
  456. % Read a CFF font.
  457. /FRD        % <resdict> <file> FRD -
  458.  { /FontSetInit /ProcSet findresource begin ReadData
  459.  } 2 !
  460.  
  461. % Copy a font, removing its FID.  If changed is true, also remove
  462. % the UniqueID and XUID, if any.  If the original dictionary doesn't have
  463. % the keys being removed, don't copy it.
  464. /.copyfontdict        % <font> <changed> .copyfontdict <dict>
  465.  { 1 index /FID known
  466.    1 index { 2 index /UniqueID known or 2 index /XUID known or } if
  467.     {        % We add 1 to the length just in case the original
  468.         % didn't have a FID.
  469.       exch dup length 1 add dict exch
  470.        {        % Stack: changed newfont key value
  471.      1 index /FID eq 4 index
  472.       { 2 index /UniqueID eq or 2 index /XUID eq or }
  473.      if not { 3 copy put } if pop pop
  474.        }
  475.       forall exch
  476.     }
  477.    if pop
  478.  } bdef
  479.  
  480. % Insert a new Encoding or Metrics into a font if necessary.
  481. % Return a possibly updated font, and a flag to indicate whether
  482. % the font was actually copied.
  483. /.updatefont        % <font> <Encoding|null> <Metrics|null> .updatefont
  484.             %   <font'> <copied>
  485.  { 2 index 4 1 roll
  486.    dup null ne
  487.     { 3 -1 roll true .copyfontdict dup /Metrics 4 -1 roll put exch }
  488.     { pop }
  489.    ifelse
  490.    dup null ne 1 index 3 index /Encoding get ne and
  491.     { exch false .copyfontdict dup /Encoding 4 -1 roll put }
  492.     { pop }
  493.    ifelse exch 1 index ne
  494.  } bdef
  495.  
  496. % ---------------- Text positioning ---------------- %
  497.  
  498. /Td_
  499.  { TextOrigin exch 4 -1 roll add 3 1 roll add
  500.    2 copy /TextOrigin load astore pop moveto
  501.  } bdef
  502. /Td { Td_ } 2 !
  503. /TD { dup neg /TextLeading gput Td_ } 2 !
  504. /T*_ { 0 TextLeading neg Td_ } bdef
  505. /T* { T*_ } 0 !
  506. /Tm
  507.  { TextMatrix astore pop settextstate
  508.    0 0 /TextOrigin load astore pop
  509.    0 0 moveto
  510.  } 6 !
  511.  
  512. % ---------------- Text painting ---------------- %
  513.  
  514. /textrenderingprocs [        % (0 is handled specially)
  515.    { tf } { tS } { tB } { tn }
  516.     % We don't know what the clipping modes mean....
  517.    4 copy
  518. ] readonly def
  519. /setshowstate
  520.  { WordSpacing 0 eq TextSpacing 0 eq and
  521.     { TextRenderingMode 0 eq
  522.        { { setfillcolor show } }
  523.        { { false charpath textrenderingprocs TextRenderingMode get exec } }
  524.       ifelse
  525.     }
  526.     { TextRenderingMode 0 eq
  527.        { WordSpacing 0 eq
  528.           { { setfillcolor TextSpacing exch 0 exch ashow } }
  529.       { TextSpacing 0 eq
  530.          { { setfillcolor WordSpacing exch 0 exch 32 exch widthshow } }
  531.          { { setfillcolor WordSpacing exch TextSpacing exch 0 32 4 2 roll 0 exch awidthshow } }
  532.         ifelse
  533.       }
  534.      ifelse
  535.        }
  536.        { { WordSpacing TextSpacing 2 index
  537.             % Implement the combination of t3 and false charpath.
  538.             % Stack: xword xchar string
  539.        0 1 2 index length 1 sub
  540.         { 2 copy 1 getinterval false charpath
  541.             % Stack: xword xchar string i
  542.           4 copy get 32 eq { add } { exch pop } ifelse 0 rmoveto
  543.           pop
  544.         }
  545.        for pop pop pop pop
  546.        textrenderingprocs TextRenderingMode get exec
  547.      }
  548.        }
  549.       ifelse
  550.     }
  551.    ifelse /Show gput
  552.  } bdef
  553. /showfirst { setshowstate Show } def
  554.  
  555. /Tj { Show } 1 !
  556. /' { T*_ Show } 1 !
  557. /" { exch Tc_ exch Tw_ T*_ Show } 3 !
  558. % TJ expects a mark followed by arguments, not an array.
  559. /TJ
  560.  { counttomark -1 1
  561.     { -1 roll dup type /stringtype eq
  562.        { Show
  563.        }
  564.        { -1000 div
  565.      currentfont /ScaleMatrix .knownget { 0 get mul } if
  566.      0 rmoveto
  567.        }
  568.       ifelse
  569.     }
  570.    for pop
  571. % Adobe implementations don't accept /[, so we don't either.
  572.  } ([) cvn !
  573.  
  574. /tf { setfillcolor currentpoint fill moveto } bdef
  575. /tn { currentpoint newpath moveto } bdef
  576. % For stroking characters, temporarily restore the graphics CTM so that
  577. % the line width will be transformed properly.
  578. /Tmatrix matrix def
  579. /tS
  580.  { setstrokecolor
  581.    currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix stroke
  582.    setmatrix moveto
  583.  } bdef
  584. /tB { gsave tf grestore tS } bdef
  585.  
  586. end readonly put        % GS_PDF_ProcSet
  587.  
  588. setglobal
  589.